/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package propres;
import java.io.*;
import java.util.*;
/**
 *
 * @author david
 */
public class arbol {
        
    public static final int lado_izdo = 1;
    public static final int lado_drcho = 2;

    private arbol izquierda= null;
    private arbol derecha= null;
    private dieta elemento=null;
    
public arbol(){
}
    
    public arbol(dieta elem) {
	elemento  = elem ;
    }  
    public int altura(){
        arbol de =get_De();
        arbol iz =get_Iz();
        int i=0;
        if(this==null||elemento==null){return i;}
        else 
        {if(get_Iz()==null&&get_De()==null){return 1;}
        else{
            if(get_Iz()==null&&get_De()!=null){return 1+get_De().altura();}
            else {
                if(get_Iz()!=null&&get_De()==null){
                    
                    return get_Iz().altura()+1;}
            else{
            int c = get_De().altura();
            i=get_Iz().altura();
            if(c>i){return c+1;}
            else{return i+1;
            }
        
        }
            }
        }
        }
    }

    public dieta get_Element() {
	return elemento;
    }

    public arbol get_Iz() {
	return izquierda;
    }

    public arbol get_De() {
	return derecha;
    }
     public void set_Iz(dieta d) {
         arbol b=new arbol(d);
	izquierda=b;
    }

    public void set_De(dieta d) {
        arbol b=new arbol(d);
	derecha=b;
    }

    public void insertar(arbol tree, int lado) throws Exception {

	if (lado==lado_izdo) {
	    if (izquierda==null) izquierda= tree;
	    else throw new Exception("Ya hay un árbol enlazado");
	} else 	if (lado==lado_drcho) {
	    if (derecha==null) derecha= tree;
	    else throw new Exception("Ya hay un árbol enlazado");
	} else throw new Exception("Lado incorrecto");

    }

    public arbol extraer(int lado) throws Exception {
        arbol subarbol;

	if (lado==lado_izdo) {
	    subarbol= izquierda;
            izquierda= null;
	} else 	if (lado==lado_drcho) {
	    subarbol= derecha;
            derecha= null;
	} else throw new Exception("Lado incorrecto");

	return subarbol;
    }

    public void imprimePreOrden() {
	
	if (izquierda!=null) izquierda.imprimePreOrden();
	if (derecha!=null) derecha.imprimePreOrden();
    }

    public void imprimePostOrden() {
	if (izquierda!=null) izquierda.imprimePostOrden();
	if (derecha!=null) derecha.imprimePostOrden();
	
    }

    public void imprimeEnOrden() {
	if (izquierda!=null) izquierda.imprimeEnOrden();
	
	if (derecha!=null) derecha.imprimeEnOrden();
    }
    //---------------------------------------------------------------
    //no eliminara los elementos repetidos recogeEnOrden2()
    public List<dieta> recogeEnOrden2() {
        List<dieta> list = new ArrayList();
        List<dieta> list1 = new ArrayList();
        List<dieta> list2 = new ArrayList();
        dieta d= new dieta();
        int m=0;
	if (izquierda!=null){
            list=izquierda.recogeEnOrden2();
}
        list.add(elemento);
        
	if (derecha!=null) {
        list=derecha.recogeEnOrden2();
       }
        return list;
    }
    //--------------------------------------------------------------
    
    public List<dieta> recogeEnOrden() {
        List<dieta> list = new ArrayList();
        List<dieta> list1 = new ArrayList();
        List<dieta> list2 = new ArrayList();
        int m=0;
	if (izquierda!=null){
            list1=izquierda.recogeEnOrden();
        Iterator jope=list1.iterator();
            m=0;
            while(jope.hasNext()){
                if(list1.get(m).equals(elemento)){}
              list.add(list1.get(m));
              m++;jope.next();
            }}
        if(!list.contains(elemento)){list.add(elemento);
        }else{
            System.out.println(" elemento en arbol recoge en orden 2 repetido "+ elemento);}
	if (derecha!=null) {
        list2=derecha.recogeEnOrden();
        Iterator jop=list2.iterator();
             m=0;
            while(jop.hasNext()){
              list.add(list2.get(m));
              m++;jop.next();
            }}
        return list;
    }
    
public void anadir_dieta(dieta A, preferencias pref){
boolean a=false;boolean b=false;

     if (elemento==null){
     elemento = A;
     }
     else{
        int r = A.comparar_dieta((dieta)elemento,pref);
        if(r<=0){
            if(get_Iz()!=null){
            izquierda.anadir_dieta(A, pref);}
           else{ set_Iz(A);}}
        else if(r>0){
            if(get_De()!=null){
        derecha.anadir_dieta(A, pref);
            }
            else{set_De(A);
        }
         }  
}
}
public void anad_d_balanc(dieta A, preferencias pref,int alt){
boolean a=false;boolean b=false;

     if (elemento==null){
     elemento = A;
     }
     else{
     if(get_De()!=null&&get_De().altura()>alt ){b=true;}
     if(get_Iz()!=null&&get_Iz().altura()>alt ){a=true;}
        int r = A.comparar_dieta((dieta)elemento,pref);
        if(r<=0){
            if(a){derecha=null;
                balancejar(A, a, pref);}
            else{
                if(get_Iz()!=null){
                  izquierda.anad_d_balanc(A, pref,alt);}
            else{ set_Iz(A);}
            }
        }
        else if(r>0){
          if(b){balancejar(A, !b, pref);}
          else{
            if(get_De()!=null){
        derecha.anad_d_balanc(A, pref,alt);
            }
            else{set_De(A);
        }
            }
          }    
}
}
     public void copia_arbol(arbol arb, preferencias pref){
         
         if(arb.get_Element()!=null){
     anad_d_balanc(arb.elemento, pref,20);
     if(arb.get_De()!=null){
     copia_arbol(arb.get_De(), pref);}
     if(arb.get_Iz()!=null){
     copia_arbol(arb.get_Iz(), pref);}
     } 
     }
     public void balancejar(dieta d, boolean iz,preferencias pref){
         arbol ar = new arbol(d);
         if(iz){
             ar.copia_arbol(get_Iz(), pref);
             ar.anadir_dieta(get_Element(), pref);
             if(ar.get_De()!=null){
             derecha=ar.derecha;}//ar.get_De();}
             if(ar.get_Iz()!=null){
             izquierda=ar.izquierda;}//ar.get_Iz();}
             elemento=d;
         }
         else{
             ar.anadir_dieta(get_Element(), pref);
            if(get_Iz()!=null){
                
             ar.copia_arbol(get_Iz(), pref);
            }
             ar.copia_arbol(get_De(), pref);
              if(ar.get_De()!=null){
             derecha=ar.get_De();}
             if(ar.get_Iz()!=null){
             izquierda=ar.get_Iz();}
             elemento=d;  
         }
     }

}
